home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_02_12 / copy_hd.pas < prev    next >
Pascal/Delphi Source File  |  1991-01-19  |  5KB  |  162 lines

  1. {********************************************************}
  2.  
  3. PROGRAM COPY_HIGH_DENSITY ;
  4.  
  5.                   {10 SEPT 88 CJB}
  6.  
  7. {COPIES 1.2 MEG DRIVE TO A SINGLE FILE ON HARD DISK, THEN
  8.  COPIES FILE FROM HARD DISK TO ANOTHER DISK IN THE 1.2
  9.  MEG DRIVE.  PURPOSE IS TO COPY A DISK WITH A BLOWN DIRECTORY }
  10.  
  11. {********************************************************}
  12. uses CRT, dos ;
  13.  
  14. TYPE
  15. BUFF = ARRAY[0..$11ff] OF BYTE ;
  16.  
  17. {********************************************************}
  18.  
  19. CONST
  20. DISK              = $13 ;
  21. READ_DISK         =   2 ;
  22. WRITE_DISK        =   3 ;
  23. HIGH_DEN          =   3 ;
  24. HEADS             =   2 ;
  25. TRACKS_PER_DISK   =  80 ;
  26. SECTORS_PER_TRACK =  15 ;
  27.  
  28. {********************************************************}
  29.  
  30. VAR
  31. HEAD, TRACK, SECTOR : BYTE ;
  32. I, J, K, L, N, M : INTEGER ;
  33. TRANSFER : FILE OF BUFF ;
  34. BUFFER : BUFF ;
  35. ASK : STRING[80] ;
  36.  
  37. REGS : REGISTERS ;
  38.  
  39. {********************************************************}
  40.  
  41. BEGIN {MAIN}
  42.     TEXTCOLOR(7) ;
  43.     WRITELN(#7) ;
  44.     WRITE('INSERT OLD DISK IN DRIVE <A> AND PRESS <RETURN> ') ;
  45.     READLN( ASK) ;
  46.     WRITELN ;
  47.  
  48.     IF HIGH_DEN = 3 THEN
  49.         WITH REGS DO
  50.             BEGIN
  51.                 AL := HIGH_DEN ;
  52.                 AH := $17 ;
  53.                 DL := 0 ;
  54.                 INTR(DISK, REGS) ;
  55.             END ; {WITH REGS}
  56.     ASSIGN(TRANSFER, 'C:TRANSFER.$$$') ;
  57.     REWRITE( TRANSFER) ;
  58.  
  59.     FOR TRACK := 0 TO TRACKS_PER_DISK - 1 DO
  60.       BEGIN
  61.         IF TRACK MOD 10 = 0 THEN
  62.             BEGIN
  63.                WRITELN ;
  64.                WRITE(TRACK DIV 10, '0:') ;
  65.             END ;
  66.             WRITE(TRACK MOD 10) ;
  67.  
  68.         FOR HEAD := 0 TO HEADS - 1 DO
  69.                 BEGIN
  70.                     WITH REGS DO
  71.                         BEGIN
  72.                             AL := SECTORS_PER_TRACK ; {ONE TRACK}
  73.                             AH := READ_DISK ;
  74.                             CL := 1 ;
  75.                             CH := TRACK ;
  76.                             DH := HEAD ;
  77.                             DL := 0 ; {DRIVE A}
  78.                             ES := SEG(BUFFER) ;
  79.                             BX := OFS(BUFFER) ;
  80.                             INTR(DISK, REGS) ;
  81.  
  82.                             IF (AL <> 0) THEN
  83.                                    BEGIN
  84.                                        TEXTCOLOR(143) ;
  85.                                        GOTOXY(WHEREX-1,WHEREY) ;
  86.                                        WRITE(TRACK MOD 10, #7) ;
  87.                                        TEXTCOLOR(7) ;
  88.                                        FOR SECTOR := 1 TO SECTORS_PER_TRACK DO
  89.                        BEGIN
  90.                                            N := 0 ;
  91.                                            REPEAT
  92.                                                N := N + 1 ;
  93.                                                AL := 1; {ONE SECTOR}
  94.                                                AH := READ_DISK ;
  95.                                                CL := SECTOR ;
  96.                                                CH := TRACK ;
  97.                                                DH := HEAD ;
  98.                                                DL := 0 ; {DRIVE A}
  99.                                                ES := SEG(BUFFER) ;
  100.                                                BX := OFS(BUFFER) +
  101.                                                      (SECTOR - 1) * 512 ;
  102.                                                INTR(DISK, REGS) ;
  103.                                            UNTIL (AL = 0) OR (N = 5) ;
  104.                        END 
  105.                                    END
  106.  
  107.                         END ;
  108.                     WRITE(TRANSFER, BUFFER) ;
  109.                 END ;{ HEAD, SECTOR}
  110.       END ;{TRACK}
  111.     CLOSE( TRANSFER) ;
  112.  
  113.     {**********************************************************}
  114.  
  115.     WRITELN ; WRITELN(#7) ;
  116.     WRITE('INSERT NEW DISK IN DRIVE <A> AND PRESS <RETURN> ') ;
  117.     READLN( ASK) ;
  118.     WRITELN ;
  119.     RESET( TRANSFER) ;
  120.     IF HIGH_DEN = 3 THEN
  121.         WITH REGS DO
  122.             BEGIN
  123.                 AL := HIGH_DEN ;
  124.                 AH := $17 ;
  125.                 DL := 0 ;
  126.                 INTR(DISK, REGS) ;
  127.             END ; {WITH REGS}
  128.  
  129.     FOR TRACK := 0 TO TRACKS_PER_DISK - 1 DO
  130.       BEGIN
  131.         IF TRACK MOD 10 = 0 THEN
  132.             BEGIN
  133.                WRITELN ;
  134.                WRITE(TRACK DIV 10, '0:') ;
  135.             END ;
  136.  
  137.         FOR HEAD := 0 TO HEADS - 1 DO
  138.                 BEGIN
  139.                     READ(TRANSFER, BUFFER) ;
  140.                     WITH REGS DO
  141.                         BEGIN
  142.                             AL := SECTORS_PER_TRACK; {ONE track}
  143.                             AH := WRITE_DISK ;
  144.                             CL := 1 ;
  145.                             CH := TRACK ;
  146.                             DH := HEAD ;
  147.                             DL := 0 ; {DRIVE A}
  148.                             ES := SEG(BUFFER) ;
  149.                             BX := OFS(BUFFER) ;
  150.                         END ;
  151.                        INTR(DISK, REGS) ; {SKIP BOOT SECTOR}
  152.                 END ; {TRACK, HEAD}
  153.                 WRITE(TRACK MOD 10) ;
  154.       END ; {TRACK}
  155.  
  156.     CLOSE( TRANSFER) ;
  157.     ERASE( TRANSFER) ;
  158.     WRITELN ; WRITELN(#7) ;
  159.     WRITELN('***ALL DONE!') ; WRITELN ;
  160.  
  161. END . {MAIN}
  162.